/*
 * PInicial.java
 *
 * Created on 6 de diciembre de 2007, 11:34 AM
 */
package ig.metrica.ui.matriz.correlacion.calculada;

import ig.metrica.origenesdedatos.ConexionBean;
import ig.metrica.origenesdedatos.ConexionPK;
import ig.metrica.origenesdedatos.OrigenDeDatosBean;
import ig.metrica.origenesdedatos.OrigenesdatosDTO;
import ig.metrica.ui.matriz.correlacion.calculada.modelo.IModeloWizzar;
import ig.metrica.ui.matriz.correlacion.calculada.modelo.MInicial;
import ig.util.Fechas;
import ig.util.MetaFabricaFormateadores;
import ig.util.MyTableModel;
import ig.util.NoContinuaException;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Hashtable;
import javax.naming.NamingException;
import javax.swing.JFormattedTextField;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.MaskFormatter;

/**
 *
 * @author  Jimmy
 */
public class PInicial extends javax.swing.JPanel implements IModeloWizzar {

    MWizzar aThis = null;
    /** Creates new form PInicial */
    MInicial modelo = new MInicial();

    public PInicial(MWizzar aThis) throws Exception {
        this.aThis = aThis;
        initComponents();
        this.TOrigenesDatos.getTableHeader().setReorderingAllowed(false);
        cargarOrigenesDeDatos();
    }

    private JFormattedTextField getFormattedTextField() {
        if (Fecha == null) {
            Fecha = new JFormattedTextField();
            DefaultFormatterFactory dff = null;
            try {
                JFormattedTextField.AbstractFormatter displayFormatter = new MaskFormatter("##/##/####");
                dff = new DefaultFormatterFactory(displayFormatter, displayFormatter, displayFormatter);
            } catch (Exception e) {
                e.printStackTrace();
            }
            Fecha.setFormatterFactory(dff);
            Fecha.setInputVerifier(MetaFabricaFormateadores.getDateVerifier());
            Fecha.setText(Fechas.getFormatoStringNOBS());
        }
        return Fecha;
    }

    private void cargarOrigenesDeDatos() throws Exception {
        try {
            Collection origenesDeDatos = modelo.buscarOrigenesDeDatos();
            Collection origenesDeDatosOK = new ArrayList();
            for (Object object : origenesDeDatos) {
                if (((OrigenesdatosDTO) object).getId() >= 3000 && ((OrigenesdatosDTO) object).getId() < 4000) {
                    origenesDeDatosOK.add(object);
                }
            }
            Object[][] data = new Object[origenesDeDatosOK.size()][2];
            int i = 0;
            horigenesDeDatos = new Hashtable<String, OrigenesdatosDTO>();
            for (Object object : origenesDeDatosOK) {
                data[i][0] = this.getNombre((OrigenesdatosDTO) object);
                data[i++][1] = false;
            }
            ((MyTableModel) this.TOrigenesDatos.getModel()).setData(data);
            TOrigenesDatos.updateUI();
        } catch (ClassNotFoundException ex) {
            errores="La clase que utiliza el dirver para conectarse con la Fuente de Datos no esta disponible\nVerifique que si este disponible\n"+ex;
            throw new NoContinuaException(errores);
        } catch (SQLException ex) {
            errores="Posible error de ConexionSQL\nVerifique la fuente de datos maestra\n"+ex;
            throw new NoContinuaException(errores);
        } catch (RemoteException ex) {
            errores="No se pudo encontrar componente en el Servidor de aplicaciones\nVerifique que los servicios estan iniciados\n"+ex;
            throw new NoContinuaException(errores);
        } catch (NamingException ex) {
            errores="No se pudo encontrar componente en el Servidor de aplicaciones\nVerifique que los servicios estan iniciados\n"+ex;
            throw new NoContinuaException(errores);
        }

    }

    /************************************
     * Clase que implementa la carga de los datos de los origenes de datos
     *************************************/
    class proceso extends Thread {

        boolean finalizado = false;

        @Override
        public void run() {
            super.run();
            errores=null;
            Collection<OrigenesdatosDTO> cc = new ArrayList<OrigenesdatosDTO>();
            Object[][] data = ((MyTableModel) TOrigenesDatos.getModel()).getData();
            for (int i = 0; i < data.length; i++) {
                if ((Boolean) data[i][1]) {
                    if (data[i][0] instanceof String) {
                        cc.add(horigenesDeDatos.get(data[i][0]));
                    } else {
                        cc.add((OrigenesdatosDTO) data[i][0]);
                    }
                }
            }
            int mAnno = Integer.parseInt(Fecha.getText().trim().substring(6, 10)) - 1900;
            int mMes = Integer.parseInt(Fecha.getText().substring(3, 5)) - 1;
            int mDia = Integer.parseInt(Fecha.getText().substring(0, 2));
            Timestamp t = new Timestamp(new Date(mAnno, mMes, mDia, 0, 0, 0).getTime());

            Integer numeroDeObservaciones = Integer.valueOf(observaciones.getValue().toString());
            try {
                if (cc.size() > 0) {
                    modelo.clear();//limpia los posibles datos cargador en otras operaciones
                    Integer sum = 100 / cc.size();
                    for (OrigenesdatosDTO o : cc) {
                        ConexionPK pk = new ConexionPK(o.getIdconexion());
                        ConexionBean conexionBean = new ConexionBean().ejbFindByPrimaryKey(pk);
                        String CONSULTA = o.getQuery();
                        CONSULTA = CONSULTA.replace("#FECHA_CORTE", "{d'" + t.toString().substring(0, 10) + "'}");
                        CONSULTA = CONSULTA.replace("#NUMERO_DE_OBSERVACIONES", numeroDeObservaciones.toString());
                        ArrayList informacion = new OrigenDeDatosBean().obtenerDatos(CONSULTA, conexionBean);
                        modelo.setDatos(informacion);
                        System.out.println("informacion:size:" + informacion.size());
                    }
                }
            } catch (NamingException ex) {
                ex.printStackTrace();
                errores="No se pudo encontrar componente en el Servidor de aplicaciones\nVerifique que los servicios estan iniciados\n"+ex;
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
                errores="La clase que utiliza el dirver para conectarse con la Fuente de Datos no esta disponible\nVerifique que si este disponible\n"+ex;
            } catch (SQLException ex) {
                ex.printStackTrace();
                errores="Posible error de Sentencia SQL\nVerifique la consulta\n"+ex;
            } catch (RemoteException ex) {
                ex.printStackTrace();
                errores="No se pudo encontrar componente en el Servidor de aplicaciones\nVerifique que los servicios estan iniciados\n"+ex;
            } catch (Exception ex) {
                ex.printStackTrace();
                errores="Error "+ex;
            }
            finalizado = true;
            try {
                this.finalize();
            } catch (Throwable ex) {
                ex.printStackTrace();
            }
        }

        public boolean isFinalizado() {
            return finalizado;
        }
    }

    private Object getNombre(OrigenesdatosDTO tmp) {
        boolean seguir = false;
        String nombre = "";
        for (int j = 0; j < tmp.getQuery().toCharArray().length && tmp.getQuery().contains("/*") && tmp.getQuery().contains("*/"); j++) {
            if (!seguir && tmp.getQuery().toCharArray()[j] == '/' && tmp.getQuery().toCharArray()[j + 1] == '*') {
                seguir = true;
            }
            if (tmp.getQuery().toCharArray()[j] == '*' && tmp.getQuery().toCharArray()[j + 1] == '/') {
                break;
            }
            if (seguir) {
                nombre = nombre + tmp.getQuery().toCharArray()[j + 2];
            }
        }
        nombre = nombre.trim();
        if (nombre.toUpperCase().startsWith("NOMBRE:")) {
            nombre = nombre.substring("NOMBRE:".length(), nombre.length()).trim();
            if (nombre.trim().equals("*/")) {
                nombre = "<No tiene nombre>";
            }
        } else if (nombre.toUpperCase().startsWith("NAME:")) {
            nombre = nombre.substring("NAME:".length(), nombre.length()).trim();
            if (nombre.trim().equals("*/")) {
                nombre = "<No tiene nombre>";
            }
        } else {
            nombre = "<No tiene nombre>";
        }
        Object obj = !"<No tiene nombre>".equals(nombre) ? nombre.substring(0, nombre.length() - 2) : tmp;
        if (obj instanceof String) {
            horigenesDeDatos.put(obj.toString(), tmp);
        }
        return !"<No tiene nombre>".equals(nombre) ? nombre.substring(0, nombre.length() - 2) : tmp;
    }

    public void siguiente() throws Exception {
        p = new proceso();
        p.start();
    }

    public boolean isSiguiente() {
        if (p == null) {
            return false;
        }
        return p.isFinalizado();
    }

    public void finalizar() throws Exception {

    }

    public void calcelar() throws Exception {

    }

    public void setObject(Object obj) throws Exception {

    }

    public Object getObject() {
        return modelo.getObject();
    }
    private String errores=null;
    public String getErrores() {
        return errores;
    }    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        Fecha = this.getFormattedTextField();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        TOrigenesDatos = new javax.swing.JTable();
        CTodosNinguno = new javax.swing.JCheckBox();
        jLabel3 = new javax.swing.JLabel();
        observaciones = new javax.swing.JSpinner();

        setName("Origenes de datos"); // NOI18N

        jLabel1.setText("Fecha");

        Fecha.setHorizontalAlignment(javax.swing.JTextField.CENTER);

        jLabel2.setText("Numero de observaciones");

        TOrigenesDatos.setModel(
            new ig.util.MyTableModel(null, new String [] {"Nombre", "Selección"}, new boolean [] {false, true})
        );
        TOrigenesDatos.setToolTipText("#FECHA_CORTE, #NUMERO_DE_OBSERVACIONES");
        jScrollPane1.setViewportView(TOrigenesDatos);

        CTodosNinguno.setText("Todos/Ninguno");
        CTodosNinguno.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                CTodosNingunoItemStateChanged(evt);
            }
        });

        jLabel3.setText("Seleccione los Origenes de datos de donde se traeran los factores");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 561, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addGap(10, 10, 10)
                        .addComponent(Fecha, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(observaciones, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(18, 18, 18)
                        .addComponent(CTodosNinguno)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(Fecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(observaciones, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(CTodosNinguno)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 138, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void CTodosNingunoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_CTodosNingunoItemStateChanged
        // TODO add your handling code here:
        Object[][] data = ((MyTableModel) this.TOrigenesDatos.getModel()).getData();
        for (int i = 0; i < data.length; i++) {
            data[i][1] = CTodosNinguno.isSelected();
        }
        ((MyTableModel) this.TOrigenesDatos.getModel()).setData(data);
        this.TOrigenesDatos.updateUI();
    }//GEN-LAST:event_CTodosNingunoItemStateChanged
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JCheckBox CTodosNinguno;
    private javax.swing.JFormattedTextField Fecha;
    private javax.swing.JTable TOrigenesDatos;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSpinner observaciones;
    // End of variables declaration//GEN-END:variables

    private Hashtable<String, OrigenesdatosDTO> horigenesDeDatos = null;
    private proceso p = null;
}
